// 双指针
/**
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 *
 */
#include "common.h"
#include <vector>

// #include <iostream>

class Solution
{
public:
    void moveZeroes(std::vector<int> &nums)
    {
        int dest = -1;
        int cur = 0;
        while (cur < nums.size())
        {
            if (nums[cur] == 0)
                ++cur;
            else
            {
                ++dest;
                int tmp = nums[dest];
                nums[dest] = nums[cur];
                nums[cur] = tmp;
                ++cur;
            }
        }
    }
};
class Solution
{
public:
    void moveZeroes(std::vector<int> &nums)
    {
        for (int cur = 0, dest = -1; cur < nums.size(); ++cur)
        {
            if (nums[cur])
            {
                std::swap(nums[++dest], nums[cur]);
            }
        }
    }
};

class Solution
{
public:
    void moveZeroes(vector<int> &nums)
    {
        for (int cur = 0, dest = -1; cur < nums.size();)
        {
            if (nums[cur++])
            {
                std::swap(nums[++dest], nums[cur]);
            }
        }
    }
};